#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
配置模块 - 管理应用程序配置
"""

import os
import sys
import json
import logging
from typing import Dict, Any

def resource_path(relative_path):
    """获取资源的绝对路径，兼容开发环境和打包后的环境"""
    if getattr(sys, 'frozen', False):
        # 运行于 PyInstaller 打包后的环境
        base_path = sys._MEIPASS
    else:
        # 运行于开发环境
        base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    return os.path.join(base_path, relative_path)

def get_config_path():
    """获取配置文件路径，确保在打包后环境也能持久保存"""
    if getattr(sys, 'frozen', False):
        # 打包后环境，使用用户目录
        config_dir = os.path.join(os.path.expanduser('~'), '.zabbix_tool')
        os.makedirs(config_dir, exist_ok=True)
        return os.path.join(config_dir, 'config.json')
    else:
        # 开发环境，使用项目目录
        config_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        return os.path.join(config_dir, 'resources', 'config.json')

def get_log_path():
    """获取日志文件路径，确保目录存在"""
    if getattr(sys, 'frozen', False):
        # 打包后环境，使用用户文档目录
        log_dir = os.path.join(os.path.expanduser('~'), '.zabbix_tool', 'logs')
    else:
        # 开发环境，使用项目目录
        log_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'logs')
    
    # 确保日志目录存在
    os.makedirs(log_dir, exist_ok=True)
    
    return os.path.join(log_dir, 'app.log')

# 配置文件路径
CONFIG_FILE = get_config_path()

# 日志配置
LOG_FILE = get_log_path()

try:
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        handlers=[
            logging.StreamHandler(),
            logging.FileHandler(LOG_FILE)
        ]
    )
    logger = logging.getLogger(__name__)
    logger.info(f"日志文件位置: {LOG_FILE}")
except Exception as e:
    # 如果文件处理器失败，仅使用控制台处理器
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        handlers=[logging.StreamHandler()]
    )
    logger = logging.getLogger(__name__)
    logger.error(f"无法设置日志文件，仅使用控制台输出: {e}")

# 默认配置
DEFAULT_CONFIG = {
    "zabbix_api": {
        "url": "http://your-zabbix-server/api_jsonrpc.php",
        "user": "Admin",
        "password": "",
        "timeout": 30
    },
    "app": {
        "name": "Zabbix Tool",
        "version": "1.0.0",
        "theme": "system"
    }
}


def load_config() -> Dict[str, Any]:
    """
    加载配置文件，如果不存在则创建默认配置
    
    Returns:
        Dict[str, Any]: 配置字典
    """
    if not os.path.exists(CONFIG_FILE):
        # 如果用户目录下没有配置文件，尝试从资源目录加载
        resource_config = resource_path(os.path.join('resources', 'config.json'))
        if os.path.exists(resource_config) and not getattr(sys, 'frozen', False):
            try:
                with open(resource_config, 'r', encoding='utf-8') as f:
                    config = json.load(f)
                    # 保存到用户目录
                    save_config(config)
                    logger.info(f"已从资源目录加载配置并保存到用户目录: {CONFIG_FILE}")
                    return config
            except Exception as e:
                logger.error(f"从资源目录加载配置失败: {e}")
        
        # 如果资源目录也没有或加载失败，创建默认配置
        save_config(DEFAULT_CONFIG)
        logger.info(f"已创建默认配置文件: {CONFIG_FILE}")
        return DEFAULT_CONFIG
    
    try:
        with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
            config = json.load(f)
            logger.info(f"已加载配置文件: {CONFIG_FILE}")
            return config
    except Exception as e:
        logger.error(f"加载配置文件失败: {e}")
        logger.info("使用默认配置")
        return DEFAULT_CONFIG


def save_config(config: Dict[str, Any]) -> bool:
    """
    保存配置到文件
    
    Args:
        config (Dict[str, Any]): 配置字典
        
    Returns:
        bool: 是否成功保存
    """
    # 确保目录存在
    os.makedirs(os.path.dirname(CONFIG_FILE), exist_ok=True)
    
    try:
        with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
            json.dump(config, f, indent=4, ensure_ascii=False)
        logger.info(f"已保存配置文件: {CONFIG_FILE}")
        return True
    except Exception as e:
        logger.error(f"保存配置文件失败: {e}")
        return False 